<?php
/*抽象工厂(Abstract Factory)是对应产品族概念的。
应对产品族概念而生，增加新的产品线很容易，但是无法增加新的产品。
在学习抽象工厂具体实例之前，应该明白两个重要的概念：产品族 和 产品等级 。
产品族：是指位于不同产品等级结构中，功能相关联的产品组成的家族。
产品等级：同一个产品的不同分类或者组成。

比如说，每个汽车公司可能要同时生产轿车、跑车、货车、客车，那么每一个工厂都要有创建轿车、货车和客车的方法。
例如：汽车分奔驰、宝马，奔驰下面还有跑车、MINI车等等。其中奔驰就是产品族，跑车、MINI车是产品等级。
再例如：AMD的主板、芯片组、CPU组成一个家族，Intel的主板、芯片组、CPU组成一个家族。而这两个家族都来自于三个产品等级：主板、芯片组、CPU。


简单工厂、工厂方法、抽象工厂总结：
抽象工厂是汽车生产工厂的抽象，工厂方法是一个汽车工厂里每种汽车型号的抽象；简单工厂和抽象工厂含义一样，只是产品型号是固定的。
简单工厂： 用来生产同一等级结构中的任意产品。（对于增加新的产品，无能为力）
工厂方法：用来生产同一等级结构中的固定产品。（支持增加任意产品）
抽象工厂：用来生产不同产品族的全部产品。（对于增加新的产品，无能为力；支持增加产品族）
以上三种工厂方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法。*/

/*奔驰性能车*/
class BenzSport {
    public function driver() {//奔驰正常行驶
    }
    public function speed() {//奔驰高性能跑车 飙车
    }
}

/*宝马性能车*/
class BaoSport {
    public function speed() {//宝马高性能车也可以 飙车

    }
    public function driver() {//正常行驶

    }
}
/*奔驰smart*/
class BenzSmart  {
    public function playMusic(){//奔驰smart小车 放动人音乐

    }
    public function driver(){//奔驰smart正常行驶

    }
}
/*宝马mini*/
class BaoMini  {
    public function playMusic() {//宝马mini 放音乐

    }
    public function driver() {//宝马mini正常行驶

    }
}
/*抽象工厂*/
interface IFactory
{
    public function makeMiniCar();//Mini车
    public function makeSportCar();//跑车
}

/*宝马工厂*/
class FactoryBao implements IFactory{
    public function makeMiniCar() {
        return new BaoMini();//生产宝马mini
    }
    public function makeSportCar() {
        return new BaoSport();//生产宝马性能车
    }
}

/*奔驰工厂*/
class FactoryBenz implements IFactory{
    public function makeMiniCar() {
        return new BenzSmart();//生产奔驰smart
    }
    public function makeSportCar() {
        return new BenzSport();//生产奔驰性能车
    }
}

/*奔驰工厂生产奔驰性能车*/
$factoryBenz = new FactoryBenz(); //奔驰工厂
$speedCar = $factoryBenz -> makeSportCar(); //创建奔驰跑车
$speedCar -> speed();//奔驰跑车 飙车